home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 32 / Mac Magazin and MacEasy Magazine CD - Issue 32.iso / Grafik & Text / OzTeX3.0 / MetaPost / Docs / manfig.mp (.txt) < prev    next >
LaTeX Document  |  1996-08-24  |  20KB  |  742 lines

  1. %% This is for the MathTime version that uses PostScript outline fonts
  2. %% ----------------------------------------------------------------
  3. %verbatimtex \documentstyle[times]{article}
  4. %    \begin{document}
  5. %etex
  6. %defaultfont := "rptmr";
  7. %% ----------------------------------------------------------------
  8. beginfig(0);
  9. draw (20,20)--(0,0)--(0,30)--(30,0)--(0,0);
  10. endfig;
  11. beginfig(2); numeric u;
  12. u=1cm;
  13. draw (2u,2u)--(0,0)--(0,3u)--(3u,0)--(0,0);
  14. pickup pencircle scaled 4pt;
  15. for i=0 upto 2:
  16.   for j=0 upto 2:
  17.     draw (i*u,j*u);
  18.   endfor
  19. endfor
  20. endfig;
  21. beginfig(3);
  22. z0 = (0,0);    z1 = (60,40);
  23. z2 = (40,90);  z3 = (10,70);
  24. z4 = (30,50);
  25. draw z0..z1..z2..z3..z4;
  26. dotlabels.top(0,2,4);
  27. dotlabels.lft(3);
  28. dotlabels.lrt(1);
  29. endfig;
  30. beginfig(104);
  31. z0 = (0,0);    z1 = (60,40);
  32. z2 = (40,90);  z3 = (10,70);
  33. z4 = (30,50);
  34. draw z0..z1..z2..z3..z4..cycle;
  35. dotlabels.top(2,4);
  36. dotlabels.lft(0,3);
  37. dotlabels.lrt(1);
  38. endfig;
  39. beginfig(204);
  40. z0 = (0,0);    z1 = (60,40);
  41. z2 = (40,90);  z3 = (10,70);
  42. z4 = (30,50);
  43. draw z0..z1..z2..z3--z4--cycle;
  44. dotlabels.top(2,4);
  45. dotlabels.lft(0,3);
  46. dotlabels.lrt(1);
  47. endfig;
  48. beginfig(5);
  49. z0 = (0,0);    z1 = (60,40);
  50. z2 = (40,90);  z3 = (10,70);
  51. z4 = (30,50);
  52. path p; p = z0..z1..z2..z3..z4;
  53. draw p;
  54. for t=0 upto 3:
  55.   draw point t of p--postcontrol t of p
  56.     --precontrol t+1 of p--point t+1 of p
  57.     dashed (evenly scaled .5);
  58. endfor
  59. dotlabels.top(0,2,4);
  60. dotlabels.lft(3);
  61. dotlabels.lrt(1);
  62. endfig;
  63. beginfig(6);
  64. z0 = (0,0);    z1 = (60,40);
  65. z2 = (40,90);  z3 = (10,70);
  66. z4 = (30,50);
  67. draw z0..z1{up}..z2{left}..z3..z4;
  68. dotlabels.top(0,2,4);
  69. dotlabels.lft(3);
  70. dotlabels.lrt(1);
  71. endfig;
  72. beginfig(7)
  73. for a=0 upto 9:
  74.   draw (0,0){dir 45}..{dir -10a}(6cm,0);
  75. endfor
  76. endfig;
  77. beginfig(8)
  78. for a=0 upto 7:
  79.   draw (0,0){dir 45}..{dir 10a}(6cm,0);
  80. endfor
  81. endfig;
  82. beginfig(109);
  83. z2=-z0=(1in,0); z1=(0,.2in);
  84. draw z0{up}..z1{right}..z2{down};
  85. dotlabels.bot(0,1,2);
  86. endfig;
  87. beginfig(209);
  88. z2=-z0=(1in,0); z1=(0,.2in);
  89. draw z0{up}...z1{right}...z2{down};
  90. dotlabels.bot(0,1,2);
  91. endfig;
  92. beginfig(110);
  93. numeric u; 10u=1.5in;
  94. -z0=z3=(5u,0);
  95. (-x1,y1)=z2=(3u,2u);
  96. draw z0..z1..z2..z3;
  97. dotlabels.bot(0,1,2,3);
  98. endfig;
  99. beginfig(210);
  100. numeric u; 10u=1.5in;
  101. -z0=z3=(5u,0);
  102. (-x1,y1)=z2=(3u,2u);
  103. draw z0..z1..tension 1.3..z2..z3;
  104. dotlabels.bot(0,1,2,3);
  105. endfig;
  106. beginfig(310);
  107. numeric u; 10u=1.5in;
  108. -z0=z3=(5u,0);
  109. (-x1,y1)=z2=(3u,2u);
  110. draw z0..z1..tension 1.5 and 1..z2..z3;
  111. dotlabels.bot(0,1,2,3);
  112. endfig;
  113. beginfig(111);
  114. numeric u, c; 10u=1.4in; c=0;
  115. z1=(0,0); (x0,-y0)=z2=(2u,5u);
  116. draw z0{curl c}..z1..{curl c}z2;
  117. dotlabels.rt(0,1,2);
  118. endfig;
  119. beginfig(211);
  120. numeric u, c; 10u=1.4in; c=1;
  121. z1=(0,0); (x0,-y0)=z2=(2u,5u);
  122. draw z0{curl c}..z1..{curl c}z2;
  123. dotlabels.rt(0,1,2);
  124. endfig;
  125. beginfig(311);
  126. numeric u, c; 10u=1.4in; c=2;
  127. z1=(0,0); (x0,-y0)=z2=(2u,5u);
  128. draw z0{curl c}..z1..{curl c}z2;
  129. dotlabels.rt(0,1,2);
  130. endfig;
  131. beginfig(411);
  132. numeric u, c; 10u=1.4in; c=infinity;
  133. z1=(0,0); (x0,-y0)=z2=(2u,5u);
  134. draw z0{curl c}..z1..{curl c}z2;
  135. dotlabels.rt(0,1,2);
  136. endfig;
  137. beginfig(13);
  138. z1=-z2=(.2in,0);
  139. x3=-x6=.3in;
  140. x3+y3=x6+y6=1.1in;
  141. z4=1/3[z3,z6];
  142. z5=2/3[z3,z6];
  143. z20=whatever[z1,z3]=whatever[z2,z4];
  144. z30=whatever[z1,z4]=whatever[z2,z5];
  145. z40=whatever[z1,z5]=whatever[z2,z6];
  146. draw z1--z20--z2--z30--z1--z40--z2;
  147. pickup pencircle scaled 1pt;
  148. draw z1--z2;
  149. draw z3--z6;
  150. dotlabels.bot(1,2);
  151. dotlabels.rt(3);
  152. dotlabels.lft(6);
  153. dotlabels.top(20,30,40);
  154. endfig;
  155. vardef llet(expr c) =
  156.   c infont defaultfont scaled magstep3
  157. enddef;
  158. primarydef p centered h =
  159.   (p shifted (h - xpart .5[llcorner p,lrcorner p], 0))
  160. enddef;
  161. beginfig(14);
  162. string s; s = "abcde";
  163. numeric u,n, ytop, ybot;
  164. n = 5;
  165. ytop = 3bp + ypart urcorner llet(s);
  166. ybot = -3bp + ypart llcorner llet(s);
  167. ytop - ybot = u;
  168. draw (n*u,ybot)--(0,ybot)--(0,ytop)--(n*u,ytop);
  169. for i=1 upto n:
  170.   draw (i*u,ybot)..(i*u,ytop);
  171.   draw llet(substring (i-1,i) of s) centered ((i-.5)*u);
  172.   label.bot(decimal i, (i*u,ybot));
  173. endfor
  174. picture llab; llab = btex \llap{$x={}$}0 etex;
  175. z0 = urcorner llab;
  176. draw llab shifted (-.5*x0, ybot-labeloffset-y0);
  177. endfig;
  178. beginfig(17);
  179. a=.7in; b=.5in;
  180. z0=(0,0);
  181. z1=-z3=(a,0);
  182. z2=-z4=(0,b);
  183. draw z1..z2..z3..z4..cycle;
  184. draw z1--z0--z2;
  185. label.top("a", .5[z0,z1]);
  186. label.lft("b", .5[z0,z2]);
  187. dotlabel.bot("(0,0)", z0);
  188. endfig;
  189. beginfig(18);
  190. numeric u;
  191. u = 1cm;
  192. draw (0,2u)--(0,0)--(4u,0);
  193. pickup pencircle scaled 1pt;
  194. draw (0,0){up}
  195.   for i=1 upto 8: ..(i/2,sqrt(i/2))*u  endfor;
  196. label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u);
  197. label.bot(btex $x$ etex, (2u,0));
  198. label.lft(btex $y$ etex, (0,u));
  199. endfig;
  200. beginfig(19);
  201. numeric ux, uy;
  202. 120ux=1.2in; 4uy=2.4in;
  203. draw (0,4uy)--(0,0)--(120ux,0);
  204. pickup pencircle scaled 1pt;
  205. draw (0,uy){right}
  206.   for ix=1 upto 8:
  207.     ..(15ix*ux, uy*2/(1+cosd 15ix))
  208.   endfor;
  209. label.bot(btex $x$ axis etex, (60ux,0));
  210. label.lft(btex $y$ axis etex rotated 90,
  211.           (0,2uy));
  212. label.lft(
  213.   btex $\displaystyle y={2\over1+\cos x}$ etex,
  214.   (120ux, 4uy));
  215. endfig;
  216. beginfig(20);
  217. picture p;
  218. p = "testing" infont "rptmr" scaled 7;
  219. draw p;
  220. draw llcorner p--lrcorner p--urcorner p--ulcorner p--cycle;
  221. dotlabel.lft(btex \tt llcorner etex, llcorner p);
  222. dotlabel.rt(btex \tt lrcorner etex, lrcorner p);
  223. dotlabel.lft(btex \tt ulcorner etex, ulcorner p);
  224. dotlabel.rt(btex \tt urcorner etex, urcorner p);
  225. endfig;
  226. beginfig(21);
  227. path p;
  228. p = (-1cm,0)..(0,-1cm)..(1cm,0);
  229. fill p{up}..(0,0){-1,-2}..{up}cycle;
  230. draw p..(0,1cm)..cycle;
  231. endfig;
  232. beginfig(22);
  233. path a, b, aa, ab;
  234. a = fullcircle scaled 2cm;
  235. b = a shifted (0,1cm);
  236. aa = halfcircle scaled 2cm;
  237. ab = buildcycle(aa, b);
  238. picture pa, pb;
  239. pa = thelabel(btex $A$ etex, (0,-.5cm));
  240. pb = thelabel(btex $B$ etex, (0,1.5cm));
  241. fill a withcolor .7white;
  242. fill b withcolor .7white;
  243. fill ab withcolor .4white;
  244. unfill bbox pa;
  245. draw pa;
  246. unfill bbox pb;
  247. draw pb;
  248. label.lft(btex $U$ etex, (-1cm,.5cm));
  249. draw bbox currentpicture;
  250. endfig;
  251. beginfig(123);
  252. path aa, b;
  253. b = a shifted (0,1cm);
  254. aa = halfcircle scaled 2cm;
  255. draw aa;
  256. draw b dashed evenly;
  257. z1 = aa intersectionpoint reverse b;
  258. z2 = reverse aa intersectionpoint b;
  259. dotlabel.rt(btex 1 etex, z1);
  260. dotlabel.lft(btex 2 etex, z2);
  261. label.bot(btex \tt aa etex, point 0 of aa);
  262. label.bot(btex \tt b etex, point 2 of b);
  263. endfig;
  264. beginfig(223);
  265. path aa, b;
  266. b = a shifted (0,1cm);
  267. aa = halfcircle scaled 2cm;
  268. numeric t[], tt[];
  269. (t1,8-tt1) = aa intersectiontimes reverse b;
  270. (4-t2,tt2) = reverse aa intersectiontimes b;
  271. pickup(pencircle scaled .3);
  272. draw aa;
  273. draw b;
  274. pickup(pencircle scaled .8);
  275. draw subpath (t1,t2) of aa;
  276. draw subpath (tt2,tt1) of b;
  277. dotlabel.rt(btex 1 etex, point t1 of aa);
  278. dotlabel.lft(btex 2 etex, point t2 of aa);
  279. label.bot(btex \tt aa etex, point 0 of aa);
  280. label.bot(btex \tt b etex, point 2 of b);
  281. endfig;
  282. beginfig(24);
  283. h=2in; w=2.7in;
  284. path p[], q[], pp;
  285. for i=2 upto 4: ii:=i**2;
  286.   p[i] = (w/ii,h){1,-ii}...(w/i,h/i)...(w,h/ii){ii,-1};
  287. endfor
  288. q0.5 = (0,0)--(w,0.5h);
  289. q1.5 = (0,0)--(w/1.5,h);
  290. pp = buildcycle(q0.5, p2, q1.5, p4);
  291. fill pp withcolor .7white;
  292. z0=center pp;
  293. picture lab; lab=thelabel(btex $f>0$ etex, z0);
  294. unfill bbox lab; draw lab;
  295. draw q0.5; draw p2; draw q1.5; draw p4;
  296. dotlabel.top(btex $P$ etex, p2 intersectionpoint q0.5);
  297. dotlabel.rt(btex $Q$ etex, p2 intersectionpoint q1.5);
  298. dotlabel.lft(btex $R$ etex, p4 intersectionpoint q1.5);
  299. dotlabel.bot(btex $S$ etex, p4 intersectionpoint q0.5);
  300. endfig;
  301. beginfig(25);
  302. numeric u;
  303. u = .2in;
  304. path a, b;
  305. a = (0,0){up}..(4u,0)..(8u,0)..(8u,4u);
  306. b = (10u,3u)..(5u,u)..(-u,u);
  307. numeric t; t=0;
  308. forsuffixes $=bot, llft, lrt, lft:
  309.   dotlabel$(decimal t, point t of a);
  310.   t:=t+1;
  311. endfor
  312. for i=0 upto 2:
  313.    dotlabel.top(decimal i, point i of b);
  314. endfor
  315. pickup(pencircle scaled .3);
  316. draw a;
  317. pickup(pencircle scaled .8);
  318. draw b;
  319. % intersections (atime, btime):
  320. % (0.2501,1.77225)
  321. % (2.58316,0.23619)
  322. % (0.75288,1.40094)
  323. endfig;
  324. beginfig(26);
  325. numeric scf, #, t[]; 
  326. 3.2scf = 2.4in;
  327. path fun;
  328. # = .1;  % Keep the function single-valued
  329. fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}..{curl .1}(3.2,2#))
  330.   yscaled(1/#) scaled scf;
  331. x1 = 2.5scf;
  332. for i=1 upto 2:
  333.   (t[i],whatever) =
  334.     fun intersectiontimes ((x[i],-infinity)--(x[i],infinity));
  335.   z[i] = point t[i] of fun;
  336.   z[i]-(x[i+1],0) = whatever*direction t[i] of fun;
  337.   draw (x[i],0)--z[i]--(x[i+1],0);
  338.   fill fullcircle scaled 3bp shifted z[i];
  339. endfor
  340. label.bot(btex $x_1$ etex, (x1,0));
  341. label.bot(btex $x_2$ etex, (x2,0));
  342. label.bot(btex $x_3$ etex, (x3,0));
  343. draw (0,0)--(3.2scf,0);
  344. pickup pencircle scaled 1pt;
  345. draw fun;
  346. endfig;
  347. beginfig(28);
  348. path p[];
  349. p1 = fullcircle scaled .6in;
  350. z1=(.75in,0)=-z3;
  351. z2=directionpoint left of p1=-z4;
  352. p2 = z1..z2..{curl1}z3..z4..{curl 1}cycle;
  353. fill p2 withcolor .4[white,black];
  354. unfill p1;
  355. draw p1;
  356. transform T;
  357. z1 transformed T = z2;
  358. z3 transformed T = z4;
  359. xxpart T=yypart T;  yxpart T=-xypart T;
  360. picture pic;
  361. pic = currentpicture;
  362. for i=1 upto 2:
  363.   pic:=pic transformed T;
  364.   draw pic;
  365. endfor
  366. dotlabels.top(1,2,3); dotlabels.bot(4);
  367. endfig;
  368. beginfig(29);
  369. if unknown withdots:    % So this works w/o MetaPost version 0.5
  370.   picture withdots; withdots=dashpattern(off 2.5 on 0 off 2.5);
  371. z0 = (0,0);
  372. z1 = (2in-2bp,0);
  373. for i=1 upto 4:
  374.   z[2i]-z[2i-2] = z[2i+1]-z[2i-1] = (0,14pt);
  375. endfor
  376. draw z0..z1 dashed evenly;
  377. label.rt(btex \tt dashed evenly etex, z1);
  378. draw z2..z3 dashed evenly scaled 2;
  379. label.rt(btex \tt dashed evenly scaled 2 etex, z3);
  380. draw z4..z5 dashed evenly scaled 4;
  381. label.rt(btex \tt dashed evenly scaled 4 etex, z5);
  382. draw z6..z7 dashed withdots;
  383. label.rt(btex \tt dashed withdots etex, z7);
  384. draw z8..z9 dashed withdots scaled 2;
  385. label.rt(btex \tt dashed withdots scaled 2 etex, z9);
  386. endfig;
  387. beginfig(30);
  388. picture e[]; e4=evenly scaled 4;
  389. z0 = (0,0);
  390. z1 = (2in,0);
  391. for i=1 upto 3:
  392.   z[2i]-z[2i-2] = z[2i+1]-z[2i-1] = (0,14pt);
  393. endfor
  394. dotlabels.lft(0,2,4,6);
  395. draw z0..z1 dashed e4;
  396. dotlabel.rt(btex 1 \tt\ draw z0..z1 dashed e4 etex, z1);
  397. draw z2..z3 dashed e4 shifted (6bp,0);
  398. dotlabel.rt(btex 3 \tt\ draw z2..z3 dashed e4 shifted (6bp,0) etex, z3);
  399. draw z4..z5 dashed e4 shifted (12bp,0);
  400. dotlabel.rt(btex 5 \tt\ draw z4..z5 dashed e4 shifted (12bp,0) etex, z5);
  401. draw z6..z7 dashed e4 shifted (18bp,0);
  402. dotlabel.rt(btex 7 \tt\ draw z6..z7 dashed e4 shifted (18bp,0) etex, z7);
  403. endfig;
  404. beginfig(31);
  405. picture d; d = dashpattern(on 6bp  off 12bp  on 6bp);
  406. draw d;
  407. endfig;
  408. beginfig(32);
  409. draw dashpattern(on 15bp off 15bp) dashed evenly;
  410. picture p;
  411. p=currentpicture;
  412. currentpicture:=nullpicture;
  413. draw fullcircle scaled 1cm xscaled 3 dashed p;
  414. endfig;
  415. beginfig(33);
  416. for i=0 upto 2:
  417.   z[i]=(0,-40i); z[i+3]-z[i]=(100,30);
  418. endfor
  419. pickup pencircle scaled 18;
  420. draw z0..z3 withcolor .8white;
  421. linecap:=butt;
  422. draw z1..z4 withcolor .8white;
  423. linecap:=squared;
  424. draw z2..z5 withcolor .8white;
  425. dotlabels.top(0,1,2,3,4,5);
  426. endfig; linecap:=rounded;
  427. beginfig(34);
  428. for i=0 upto 2:
  429.   z[i]=(0,-50i); z[i+3]-z[i]=(60,40);
  430.   z[i+6]-z[i]=(120,0);
  431. endfor
  432. pickup pencircle scaled 24;
  433. draw z0--z3--z6 withcolor .8white;
  434. linejoin:=mitered;
  435. draw z1..z4--z7 withcolor .8white;
  436. linejoin:=beveled;
  437. draw z2..z5--z8 withcolor .8white;
  438. dotlabels.bot(0,1,2,3,4,5,6,7,8);
  439. endfig; linejoin:=rounded;
  440. beginfig(35);
  441. z2a=(0,0);
  442. (-x1a,y1a) = -z3a = .5in*unitvector(6,1);
  443. z1b - z1a = .75*z1a rotated -90;
  444. z2b - z1b = whatever*(z2a-z1a);
  445. z3b - z2b = whatever*(z3a-z2a);
  446. y2b = 0;
  447. z3b - z3a = whatever*(z3a rotated 90);
  448. z0b-z1b = z0a-z1a = z1a;
  449. x4a=x2a; x4b=x2b;
  450. y4a = y4b = 1.3*y3b;
  451. fill z1a--z2a--z3a--z3b--z2b--z1b--cycle withcolor .8 white;
  452. for p= z2a--z4a, z2b--z4b, z0a--z1a, z0b--z1b:
  453.    draw p dashed evenly;
  454. endfor
  455. drawdblarrow z4a--z4b;
  456. drawdblarrow z0a--z0b;
  457. label.bot(btex miter length etex, .5[z4a,z4b]);
  458. label.ulft(btex line width etex, .5[z0a,z0b]);
  459. endfig;
  460. beginfig(36);
  461. z[-1]=(0,0); z0=(1in,0);
  462. for i=1 upto 6:
  463.   z[i]-z[i-2] = (0,-15pt);
  464.   if x[i]=0: label.lft(decimal i, z[i]);
  465. endfor
  466. drawarrow z1..z2;
  467. drawarrow reverse(z3..z4);
  468. drawdblarrow z5..z6;
  469. label.rt(btex 2 \tt\ drawarrow z1..z2 etex, z2);
  470. label.rt(btex 4 \tt\ drawarrow reverse(z3..z4) etex, z4);
  471. label.rt(btex 6 \tt\ drawdblarrow z5..z6 etex, z6);
  472. endfig;
  473. beginfig(37);
  474. path p, q, r;
  475. ahlength := 1.5cm;
  476. pickup pencircle scaled .2cm;
  477. p = (0,0)..{right}(2.5cm,2cm);
  478. q = counterclockwise arrowhead p;
  479. z0 = directionpoint up of q;
  480. z.a = directionpoint right of q;
  481. z.b = directionpoint (-1,-1) of q;
  482. drawarrow p withcolor .4white;
  483. pickup defaultpen;
  484. undraw p;
  485. undraw q;
  486. ahlength:=4bp;
  487. z.a1-z0 = .3cm*unitvector(z.a-z0) rotated 90;
  488. z.a1-z.a2 = z0-z.a;
  489. z.b1-z0 = .3cm*unitvector(z.b-z0) rotated -90;
  490. z.b1-z.b2 = z0-z.b;
  491. z.ab = whatever[z.a1,z.a2] = whatever[z.b1,z.b2];
  492. z.a0-z.ab = .4cm*unitvector(z.a1-z.a2);
  493. z.b0-z.ab = .4cm*unitvector(z.b1-z.b2);
  494. drawdblarrow z.a1..z.a2;
  495. label.lrt(btex \tt ahlength etex, .9[z.a1,z.a2]);
  496. draw z.a1..z.a0 dashed evenly;
  497. drawdblarrow z.b1..z.b2;
  498. label.urt(btex \tt ahlength etex, .9[z.b1,z.b2]);
  499. draw z.b1..z.b0 dashed evenly;
  500. r = z.a0{(z.a2-z.a0) rotated 90}..{(z.b2-z.b0)rotated 90}z.b0;
  501. draw r;
  502. label.rt(btex \tt ahangle etex, point .5 of r);
  503. endfig;
  504. beginfig(38);
  505. pickup pencircle scaled .2in yscaled .08 rotated 30;
  506. x0=x3=x4;
  507. z1-z0 = .45in*dir 30;
  508. z2-z3 = whatever*(z1-z0);
  509. z6-z5 = whatever*(z1-z0);
  510. z1-z6 = 1.2*(z3-z0);
  511. rt x3 = lft x2;
  512. x5 = .55[x4,x6];
  513. y4 = y6;
  514. lft x3 = bot y5 = 0;
  515. top y2 = .9in;
  516. draw z0--z1--z2--z3--z4--z5--z6 withcolor .7white;
  517. dotlabels.top(0,1,2,3,4,5,6);
  518. endfig;
  519. beginfig(40);
  520. path p[];
  521. p1 = (0,0){curl 0}..(5pt,-3pt)..{curl 0}(10pt,0);
  522. p2 = p1..(p1 yscaled-1 shifted(10pt,0));
  523. p0 = p2;
  524. for i=1 upto 3:  p0:=p0.. p2 shifted (i*20pt,0);
  525.   endfor
  526. for j=0 upto 8:  draw p0 shifted (0,j*10pt);
  527.   endfor
  528. p3 = fullcircle shifted (.5,.5) scaled 72pt;
  529. clip currentpicture to p3;
  530. draw p3;
  531. endfig;
  532. marksize=4pt;
  533. angle_radius=8pt;
  534. def draw_mark(expr p, a) =
  535.   begingroup
  536.   save t, dm; pair dm;
  537.   t = arctime a of p;
  538.   dm = marksize*unitvector direction t of p
  539.     rotated 90;
  540.   draw (-.5dm.. .5dm) shifted point t of p;
  541.   endgroup
  542. enddef;
  543. def draw_marked(expr p, n) =
  544.   begingroup
  545.   save amid;
  546.   amid = .5*arclength p;
  547.   for i=-(n-1)/2 upto (n-1)/2:
  548.     draw_mark(p, amid+.6marksize*i);
  549.   endfor
  550.   draw p;
  551.   endgroup
  552. enddef;
  553. def mark_angle(expr a, b, c, n) =
  554.   begingroup
  555.   save s, p; path p;
  556.   p = unitvector(a-b){(a-b)rotated 90}..unitvector(c-b);
  557.   s = .9marksize/length(point 1 of p - point 0 of p);
  558.   if s<angle_radius: s:=angle_radius; fi
  559.   draw_marked(p scaled s shifted b, n);
  560.   endgroup
  561. enddef;
  562. def mark_rt_angle(expr a, b, c) =
  563.   draw ((1,0)--(1,1)--(0,1))
  564.        zscaled (angle_radius*unitvector(a-b)) shifted b
  565. enddef;
  566. beginfig(42);
  567. pair a,b,c,d;
  568. b=(0,0); c=(1.5in,0); a=(0,.6in);
  569. d-c = (a-b) rotated 25;
  570. dotlabel.lft("a",a);
  571. dotlabel.lft("b",b);
  572. dotlabel.bot("c",c);
  573. dotlabel.llft("d",d);
  574. z0=.5[a,d];
  575. z1=.5[b,c];
  576. (z.p-z0) dotprod (d-a) = 0;
  577. (z.p-z1) dotprod (c-b) = 0;
  578. draw a--d;
  579. draw b--c;
  580. draw z0--z.p--z1;
  581. draw_marked(a--b, 1);
  582. draw_marked(c--d, 1);
  583. draw_marked(a--z.p, 2);
  584. draw_marked(d--z.p, 2);
  585. draw_marked(b--z.p, 3);
  586. draw_marked(c--z.p, 3);
  587. mark_angle(z.p, b, a, 1);
  588. mark_angle(z.p, c, d, 1);
  589. mark_angle(z.p, c, b, 2);
  590. mark_angle(c, b, z.p, 2);
  591. mark_rt_angle(z.p, z0, a);
  592. mark_rt_angle(z.p, z1, b);
  593. endfig;
  594. def getmid(suffix p) =
  595.   pair p.mid[], p.off[], p.dir[];
  596.   for i=0 upto 36:
  597.     p.dir[i] = dir(5*i);
  598.     p.mid[i]+p.off[i] = directionpoint p.dir[i] of p;
  599.     p.mid[i]-p.off[i] = directionpoint -p.dir[i] of p;
  600.   endfor
  601. enddef;
  602. def joinup(suffix pt, d)(expr n) =
  603.   begingroup
  604.   save res, g; path res;
  605.   res = pt[0]{d[0]};
  606.   for i=1 upto n:
  607.     g:= if (pt[i]-pt[i-1]) dotprod d[i] <0: - fi 1;
  608.     res := res{g*d[i-1]}...{g*d[i]}pt[i];
  609.   endfor
  610.   res
  611.   endgroup
  612. enddef;
  613. beginfig(45)
  614. path p, q;
  615. p = ((5,2)...(3,4)...(1,3)...(-2,-3)...(0,-5)...(3,-4)
  616.      ...(5,-3)...cycle) scaled .3cm shifted (0,5cm);
  617. getmid(p);
  618. draw p;
  619. draw joinup(p.mid, p.dir, 36)..cycle;
  620. q = joinup(p.off, p.dir, 36);
  621. draw q..(q rotated 180)..cycle;
  622. drawoptions(dashed evenly);
  623. for i=0 upto 3:
  624.   draw p.mid[9i]-p.off[9i]..p.mid[9i]+p.off[9i];
  625.   draw -p.off[9i]..p.off[9i];
  626. endfor
  627. endfig;
  628. input boxes
  629. \beginfig(48);
  630. fill unitsquare xscaled 1.1in yscaled .7in withcolor .9white;
  631. boxit(currentpicture);
  632. dx = dy = .25in;
  633. clearit; drawboxed();
  634. forsuffixes $=n,c: makelabel.top(str $, $); endfor
  635. makelabel.bot("s",s);
  636. forsuffixes $=ne,e,se: makelabel.rt(str $, $); endfor
  637. forsuffixes $=nw,w,sw: makelabel.lft(str $, $); endfor
  638. pickup pencircle scaled .3bp;
  639. vardef larrow@#(expr a, da, s) =
  640.   drawdblarrow a..a+da; label@#(s,a+.5da); enddef;
  641. larrow.rt(n, (0,-dy), "dy");
  642. larrow.rt(s, (0,dy), "dy");
  643. larrow.top(e, (-dx,0), "dx");
  644. larrow.top(w, (dx,0), "dx");
  645. endfig;
  646. beginfig(49);
  647. boxjoin(a.se=b.sw; a.ne=b.nw);
  648. boxit.a(btex\strut$\cdots$ etex);    boxit.ni(btex\strut$n_i$ etex);
  649. boxit.di(btex\strut$d_i$ etex);      boxit.ni1(btex\strut$n_{i+1}$ etex);
  650. boxit.di1(btex\strut$d_{i+1}$ etex); boxit.aa(btex\strut$\cdots$ etex);
  651. boxit.nk(btex\strut$n_k$ etex);      boxit.dk(btex\strut$d_k$ etex);
  652. drawboxed(di,a,ni,ni1,di1,aa,nk,dk); label.lft("ndtable:", a.w);
  653. interim defaultdy:=7bp;
  654. boxjoin(a.sw=b.nw; a.se=b.ne);
  655. boxit.ba(); boxit.bb(); boxit.bc();
  656. boxit.bd(btex $\vdots$ etex); boxit.be(); boxit.bf();
  657. bd.dx=8bp; ba.ne=a.sw-(15bp,10bp);
  658. drawboxed(ba,bb,bc,bd,be,bf); label.lft("hashtab:",ba.w);
  659. vardef ndblock suffix $ =
  660.   boxjoin(a.sw=b.nw; a.se=b.ne);
  661.   forsuffixes $$=$1,$2,$3: boxit$$(); ($$dx,$$dy)=(5.5bp,4bp);
  662.   endfor; enddef;
  663. ndblock nda;  ndblock ndb;  ndblock ndc;
  664. nda1.c-bb.c = ndb1.c-nda3.c = (whatever,0);
  665. xpart ndb3.se = xpart ndc1.ne = xpart di.c;
  666. ndc1.c - be.c = (whatever,0);
  667. drawboxed(nda1,nda2,nda3, ndb1,ndb2,ndb3, ndc1,ndc2,ndc3);
  668. drawarrow bb.c -- nda1.w;
  669. drawarrow be.c -- ndc1.w;
  670. drawarrow nda3.c -- ndb1.w;
  671. drawarrow nda1.c{right}..{curl0}ni.c cutafter bpath ni;
  672. drawarrow nda2.c{right}..{curl0}di.c cutafter bpath di;
  673. drawarrow ndc1.c{right}..{curl0}ni1.c cutafter bpath ni1;
  674. drawarrow ndc2.c{right}..{curl0}di1.c cutafter bpath di1;
  675. drawarrow ndb1.c{right}..nk.c cutafter bpath nk;
  676. drawarrow ndb2.c{right}..dk.c cutafter bpath dk;
  677. x.ptr=xpart aa.c;   y.ptr=ypart ndc1.ne;
  678. drawarrow subpath (0,.7) of (z.ptr..{left}ndc3.c) dashed evenly;
  679. label.rt(btex \strut ndblock etex, z.ptr); endfig;
  680. \beginfig(50)
  681. interim circmargin := .07in;
  682. fill unitsquare xscaled 1.1in yscaled .7in withcolor .9white;
  683. circleit(currentpicture);
  684. dx = dy;
  685. clearit; drawboxed();
  686. forsuffixes $=n,c: makelabel.top(str $, $); endfor
  687. makelabel.bot("s",s);
  688. makelabel.rt("e", e);
  689. makelabel.lft("w", w);
  690. pickup pencircle scaled .3bp;
  691. vardef larrow@#(expr a, da, s) =
  692.   drawdblarrow a..a+da; label@#(s,a+.5da); enddef;
  693. larrow.rt(n, (0,-dy), "dy");
  694. larrow.rt(s, (0,dy), "dy");
  695. larrow.top(e, (-dx,0), "dx");
  696. larrow.top(w, (dx,0), "dx");
  697. endfig;
  698. vardef drawshadowed(text t) =
  699.   fixsize(t);
  700.   forsuffixes s=t:
  701.     fill bpath.s shifted (1pt,-1pt);
  702.     unfill bpath.s;
  703.     drawboxed(s);
  704.   endfor
  705. enddef;
  706. beginfig(51)
  707. circleit.a(btex Box 1 etex);
  708. circleit.b(btex Box 2 etex);
  709. b.n = a.s - (0,20pt);
  710. drawshadowed(a,b);
  711. drawarrow a.s -- b.n;
  712. endfig;
  713. vardef cuta(suffix a,b) expr p =
  714.   drawarrow p cutbefore bpath.a cutafter bpath.b;
  715.   point .5*length p of p
  716. enddef;
  717. vardef self@# expr p =
  718.   cuta(@#,@#) @#.c{curl0}..@#.c+p..{curl0}@#.c  enddef;
  719. beginfig(52);
  720. verbatimtex \def\stk#1#2{$\displaystyle{\matrix{#1\cr#2\cr}}$} etex
  721. circleit.aa(btex\strut Start etex); aa.dx=aa.dy;
  722. circleit.bb(btex \stk B{(a|b)^*a} etex);
  723. circleit.cc(btex \stk C{b^*} etex);
  724. circleit.dd(btex \stk D{(a|b)^*ab} etex);
  725. circleit.ee(btex\strut Stop etex); ee.dx=ee.dy;
  726. numeric hsep;
  727. bb.c-aa.c = dd.c-bb.c = ee.c-dd.c = (hsep,0);
  728. cc.c-bb.c = (0,.8hsep);
  729. xpart(ee.e - aa.w) = 3.8in;
  730. drawboxed(aa,bb,cc,dd,ee);
  731. label.ulft(btex$b$etex, cuta(aa,cc) aa.c{dir50}..cc.c);
  732. label.top(btex$b$etex, self.cc(0,30pt));
  733. label.rt(btex$a$etex, cuta(cc,bb) cc.c..bb.c);
  734. label.top(btex$a$etex, cuta(aa,bb) aa.c..bb.c);
  735. label.llft(btex$a$etex, self.bb(-20pt,-35pt));
  736. label.top(btex$b$etex, cuta(bb,dd) bb.c..dd.c);
  737. label.top(btex$b$etex, cuta(dd,ee) dd.c..ee.c);
  738. label.lrt(btex$a$etex, cuta(dd,bb) dd.c..{dir140}bb.c);
  739. label.bot(btex$a$etex, cuta(ee,bb) ee.c..tension1.3 ..{dir115}bb.c);
  740. label.urt(btex$b$etex, cuta(ee,cc) ee.c{(cc.c-ee.c)rotated-15}..cc.c);
  741. endfig;
  742.